local voucherId = ARGV[1]

local userId = ARGV[2]
--修改 lua脚本 确认有抢购资格后 直接向 stream.orders中添加消息 内容包含
--voucherId useID orderID
local orderId = ARGV[3]

local stockKey = 'seckill:stock:' .. voucherId

local orderKey = 'seckill:order:' .. voucherId



if (tonumber(redis.call('get',stockKey)) <= 0) then
    --库存不足
    return 1
end
-- 判断用户是否下单
if (redis.call('sismember',orderKey,userId) == 1) then
    --    判断返回值是否为 1，即 userId 是否是集合 orderKey 的成员
    --Redis 的 SISMEMBER 命令
    --命令格式：SISMEMBER key member
    --作用：检查指定的 member 是否是集合 key 的成员。
    --返回值：
    --如果 member 是集合的成员，返回 1。
    --如果 member 不是集合的成员，返回 0
    --性能：SISMEMBER 命令的时间复杂度是 O(1)，因此在高并发场景下性能较好。
    --数据一致性：确保集合中的数据是实时更新的，避免出现数据不一致的情况。
    --错误处理：在实际应用中，需要处理 Redis 命令执行时可能出现的异常，例如网络问题或 Redis 服务不可用。
    -- 已下单 不允许重复下单
    return 2
end

 -- 扣减库存
redis.call('incrby',stockKey,-1)
redis.call('sadd',orderKey,userId)
                                               --k      v        k      v
--修改后发消息到消息队列中 xadd stream.orders * voucherId $userId orderID $orderId

redis.call('xadd','stream.orders', '*', 'voucherId', voucherId, 'userId', userId,'id', orderId)

return 0;
--redis.call('sadd', orderKey, userId)
--命令：SADD key member [member ...]
--作用：将一个或多个成员添加到集合中。如果成员已经存在于集合中，则不会重复添加。
--返回值：
--如果成员被成功添加到集合中，返回 1。
--如果成员已经存在于集合中，返回 0。
--集合类型：orderKey 是一个 Redis 集合（Set）的键名，userId 是要添加到集合中的成员。
--2. redis.call('incrby', stockKey, -1)
--命令：INCRBY key increment
--作用：将键 key 的值增加指定的整数 increment。如果键不存在，则会先将其值设置为 0，然后执行增加操作。
--返回值：增加后的值。
--数据类型：stockKey 是一个 Redis 字符串（String）类型的键名，用于存储库存数量